package app.contatos.model;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class ContatoHelper extends SQLiteOpenHelper {

	private static final String NOME_BANCO = "contatos.db";
	private static final int VERSAO = 2;
	private static final String TAG = "ContatoHelper";
	
	public ContatoHelper(Context context) {
		super(context, NOME_BANCO, null, VERSAO);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE contato ( _id INTEGER PRIMARY KEY AUTOINCREMENT," +
				"nome TEXT, telefone TEXT, email TEXT," +
				// versao 2
				"grupo INTEGER NOT NULL DEFAULT 0 );");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// ainda não implementado...
		// http://stackoverflow.com/a/3505944/1152679
		// http://code.google.com/p/openintents/source/browse/trunk/notepad/NotePad/src/org/openintents/notepad/NotePadProvider.java?r=3878
		Log.w(TAG, "Atualizando banco de dados da versão "
				+ oldVersion + " para " + newVersion + ".");
		if (newVersion > oldVersion) {
			switch (oldVersion) {
			case 2:
				try {
					db.execSQL("ALTER TABLE contato " +
							"ADD COLUMN grupo INTEGER NOT NULL DEFAULT 0");
				} catch (SQLException e) {
					Log.e(TAG, "Erro ao executar SQL: ", e);
				}
			default:
				Log.w(TAG, "Versão desconhecida: " + oldVersion + ". Criando novo banco de dados.");
                db.execSQL("DROP TABLE IF EXISTS contato");
                onCreate(db);
			}
		}
		
	}
	
	public void criar(Contato contato) {
		ContentValues values = new ContentValues();
		values.put("nome", contato.getNome());
		values.put("telefone", contato.getTelefone());
		values.put("email", contato.getEmail());
		values.put("grupo", contato.getGrupo());
		
		getWritableDatabase().insert("contato", "telefone", values);
	}
	
	public void criar(ContentValues values) {
		getWritableDatabase().insert("contato", "telefone", values);
	}
	
	public Cursor listar() {
		return getReadableDatabase()
			.rawQuery("SELECT _id, nome, telefone, email, grupo " +
					"FROM contato ORDER BY nome", null);
	}
	
	public Cursor listar(String grupo) {
		String[] params = {grupo};
		return getReadableDatabase()
				.rawQuery("SELECT _id, nome, telefone, email, grupo " +
						"FROM contato " +
						"WHERE grupo = ? ORDER BY nome", params);
	}
	
	public String getNome(Cursor c) {
		return c.getString(1);
	}
	
	public String getTelefone(Cursor c) {
		return c.getString(2);
	}
	
	public String getEmail(Cursor c) {
		return c.getString(3);
	}
	
	public int getGrupo(Cursor c) {
		return c.getInt(4);
	}
	
	public Cursor ler(String id) {
		String[] params = {id};
		return getReadableDatabase()
			.rawQuery("SELECT _id, nome, telefone, email, grupo " +
					"FROM contato WHERE _id = ?", params);
	}
	
	public void atualizar(String id, Contato contato) {
		ContentValues values = new ContentValues();
		values.put("nome", contato.getNome());
		values.put("telefone", contato.getTelefone());
		values.put("email", contato.getEmail());
		values.put("grupo", contato.getGrupo());
		String[] params = {id};
		getWritableDatabase().update("contato", values, "_id = ?", params);
	}
	
	public void atualizar(String id, ContentValues values) {
		String[] params = {id};
		getWritableDatabase().update("contato", values, "_id = ?", params);
	}
	
	public int deletar(String id) {
		String whereClause = "_id = ?";
		String[] whereArgs = {id};
		return getWritableDatabase().delete("contato", whereClause, whereArgs);
	}
}
